package net.comfycastle.musicplayer;

import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.View;
import android.widget.ListView;

/**
 * 앨범 내부의 목록을 표현하는 Fragment
 * @author ricale
 *
 */
public class InalbumFragment extends BaseListFragment {
	///////////
	//////////
	/////////   constant
	
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 프래그먼트 아이디의 키값 */
	private static final String KEY_ID            = "InalbumFragment.keyId";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 앨범 이름의 키값 */
	private static final String KEY_NAME          = "InalbumFragment.keyName";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 앨범의 아티스트 이름의 키값 */
	private static final String KEY_TITLEARTIST   = "InalbumFragment.keyTitleArtist";
	/** 객체 생성 당시 argument로 전달되는 bundle 객체에서 앨범의 아티스트가 앨범 아티스트인지(boolean)의 키값 */
	private static final String KEY_ISALBUMARTIST = "InalbumFragment.keyIsAlbumArtist";
	
	///////////
	//////////
	/////////   constructor
	
	/**
	 * FragInalbum.newInstance(fragmentId, "", "", false)를 호출한다.
	 * @param fragmentId 생성될 인스턴스의 고유 아이디
	 * @return FragInalbum의 인스턴스
	 */
	public static InalbumFragment newInstance(OBJECTID fragmentId) {
		return newInstance(fragmentId, "", "", false);
	} // end newInstance(FragmentId)
	
	/**
	 * FragInalbum의 인스턴스를 생성/반환하는 정적 메소드
	 * 인자를 받지 못하는 Fragment 클래스 생성자 대신 인자를 받는다.
	 * @param fragmentId 생성될 인스턴스의 고유 아이디
	 * @param name   앨범 이름
	 * @param artist 앨범의 아티스트
	 * @param isAA   앨범의 아티스트는 앨범 아티스트인가
	 * @return FragInalbum의 인스턴스
	 */
	public static InalbumFragment newInstance(OBJECTID fragmentId, String name, String artist, boolean isAA) {
		InalbumFragment instance = new InalbumFragment();
		
		Bundle bundle = new Bundle();
		bundle.putString(KEY_ID,            fragmentId.name());
		bundle.putString(KEY_NAME,          name);
		bundle.putString(KEY_TITLEARTIST,   artist);
		bundle.putBoolean(KEY_ISALBUMARTIST,isAA);
		instance.setArguments(bundle);
		
		return instance;
	} // end newInstance(FragmentId, String, String, boolean)
	
	///////////
	//////////
	/////////   getter
	
	/**
	 * 이 인스턴스의 고유 아이디를 리턴한다.
	 * @return 이 인스턴스의 고유 아이디
	 */
	public OBJECTID getFragmentId() {
		return OBJECTID.valueOf(getArguments().getString(KEY_ID));
	} // end getFragmentId
	
	/**
	 * 앨범의 이름을 리턴한다.
	 * @return 앨범 이름
	 */
	public String getName() {
		return getArguments().getString(KEY_NAME);
	} // end getName
	
	/**
	 * 앨범의 아티스트를 리턴한다.
	 * @return 앨범의 아티스트
	 */
	public String getArtist() {
		return getArguments().getString(KEY_TITLEARTIST);
	} // end getArtist
	
	/**
	 * 앨범의 아티스트가 앨범아티스트인가를 리턴한다.
	 * @return 앨범의 아티스트는 앨범아티스트인가
	 */
	public boolean getIsAA() {
		return getArguments().getBoolean(KEY_ISALBUMARTIST);
	} // end getIsAA	
	
	///////////
	//////////
	/////////   methods
	
	public String getTitleForWindow() {
		return null;
	}
	
	/**
	 * 앨범의 내부 목록을 생성한다.
	 */
	protected void setList() {
		String  name   = getName();
		String  artist = getArtist();
		boolean isAA   = getIsAA();
		
	    String[] columns;
	    if(isAA) {
	    	columns = new String[] {MPApp.TAG_ID, MPApp.TAG_TRACK, MPApp.TAG_TITLE, MPApp.TAG_ARTIST, MPApp.TAG_DURATION};
	    } else {
	    	columns = new String[] {MPApp.TAG_ID, MPApp.TAG_TRACK, MPApp.TAG_TITLE, MPApp.TAG_DURATION};
	    } // end if
	    
	    Cursor cursor = getActivity().getContentResolver().query(Audio.Media.EXTERNAL_CONTENT_URI,
	    		                                                 columns,
	    		                                                 MusicUtility.makeWhere(MPApp.TAG_ALBUM, name, artist, isAA),
	    		                                                 null,
	    		                                                 MPApp.TAG_TRACK);
	    
	    InalbumMCAdapter adapter = new InalbumMCAdapter(getActivity(), cursor);
	    
	    if(isAA) {
	    	adapter.setViewState(InalbumMCAdapter.VIEWSTATE.BYALBUMARTIST);
	    } // end if
	    
	    setListAdapter(adapter);
	} // end setList
	
	///////////
	//////////
	/////////   event listener & callback method
	
	/**
	 * 리스트가 눌렸을 때의 콜백 메소드
	 */
	@Override
	public void onListItemClick(ListView l, View view, int position, long id) {
		BaseListFragment.OnListItemClickListener lintener = (BaseListFragment.OnListItemClickListener)getActivity();
		lintener.onItemClick(getFragmentId(), l, view, position, id);
	} // onListItemClick
}// end FragInalbum